//
//  DJMainViewController.swift
//  DJWeibo
//
//  Created by demo on 2017/2/7.
//  Copyright © 2017年 demo. All rights reserved.
//

import UIKit

class DJMainViewController: UITabBarController {

    //定时器
    fileprivate var timer:Timer?
    
    override func viewDidLoad() {
        super.viewDidLoad()

        setupChildControllers()
        setupComposeButton()
        setupTimer()
        
        
        //设置代理
        delegate = self
        
        //注册通知
        //NotificationCenter.default.addObserver(self, selector: #selector(userLogin), name: NSNotification.Name(rawValue: DJUserShouldLoginNotification), object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(userLogin(n:)), name: NSNotification.Name(rawValue: DJUserShouldLoginNotification), object: nil)
        
        // Do any additional setup after loading the view.
        //测试未读数量
        WBNetworkManager.shared.unreadCount{
            (count) in
            print("有\(count)条新微博")
        }
    }
    
    deinit {
        //销毁时钟
        timer?.invalidate()
        
        NotificationCenter.default.removeObserver(self)
    }
    
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask{
        return .portrait     //竖屏
        //用代码控制设备方向，好处：可以在横屏的时候单独处理
        //设置方向后，当前控制器及子控制器都会支持这个方向
        //视频播放通常用modal展示
    }
    
    //MARK: -监听方法
    @objc private func userLogin(n:Notification)
    {
        print("用户登录通知\(n)")
        //展现登录控制器 - 通常会和UINavigationController连用
        let nav = UINavigationController(rootViewController:DJOAuthViewController())
        present(nav, animated: true, completion: nil)
        
    }
    //撰写微博
    //FIXME: 没有实现
    @objc fileprivate func composeStatus(){
        print("撰写微博")
        
        //测试方向旋转
        let vc = UIViewController()
        
        vc.view.backgroundColor = UIColor.cz_random()
        let nav = UINavigationController(rootViewController: vc)
        
        present(nav, animated: true, completion: nil)
        
    }
    
    //MARK: -私有控件
    //撰写按钮
    lazy var composeButton:UIButton = UIButton.cz_imageButton("tabbar_compose_icon_add", backgroundImageName: "tabbar_compose_button")

}

//MARK:- UITabBarControllerDelegate
extension DJMainViewController:UITabBarControllerDelegate{
    //将要选择tabbarItem
    //参数：tabbarController、目标控制器
    //返回return:是否切换到目标控制器
    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
        print("即将切换到\(viewController)")
        
        //1、获取控制器在数组中的索引
       let idx = childViewControllers.index(of: viewController)
        
        //2、获取当前索引,判断当前索引是首页，同时index也是首页，重复点击首页的按钮
        if selectedIndex == 0 && idx == selectedIndex{
            print("点击首页")
            //让表哥滚动到顶部
            //获取到控制器
            let nav = childViewControllers[0] as! UINavigationController
            let vc = nav.childViewControllers[0] as! DJHomeViewController
            //滚动到顶部
            vc.tableView?.setContentOffset(CGPoint(x:0,y:-64), animated: true)
            //刷新数据-增加延迟，保证表格先滚动到顶部再刷新
            DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: {
                    vc.loadData()
            })
        }
        //判断目标控制器是否是ViewController
        return !viewController.isMember(of: UIViewController.self)
    }

}

//MARK:-时钟相关方法
extension DJMainViewController{
    //定义时钟
    fileprivate func setupTimer(){
        timer = Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)
    }
    //时钟触发方法
    @objc private func updateTimer(){
        
        //登录了才设置计时器刷新微博
        if !WBNetworkManager.shared.userLogon {
            return
        }
        
        WBNetworkManager.shared.unreadCount{
            (count) in
            //设置首页tabbarItem的badgeNumber
            print("检测到\(count)条微博")
            self.tabBar.items?[0].badgeValue = count > 0 ? "\(count)" : nil
            
            //设置App的badgeNumber,从iOS8.0之后，要用户授权才能显示数字
            UIApplication.shared.applicationIconBadgeNumber = count
        }
    }
}


//MARK: -设置界面
extension DJMainViewController{
    
    //设置撰写按钮    ------tabbar中间加按钮
    func setupComposeButton(){
        tabBar.addSubview(composeButton)
        
        //设置按钮位置    ----把撰写按钮设置到中间
        //计算按钮宽度
        let count = CGFloat(childViewControllers.count) //把Int转换成CGFloat
        let w = tabBar.bounds.width/count /* - 1*/
        //减小缩进距离，按钮宽度变大，挡住按钮间的容错点
        composeButton.frame = tabBar.bounds.insetBy(dx: 2 * w, dy: 0)
        //insetBy对应OC中的CGRectInset  正数向内缩进，负数向外扩展
        
        //按钮监听方法
        composeButton.addTarget(self, action: #selector(composeStatus), for: .touchUpInside)
    }
    
    //设置所有子控制器
    func setupChildControllers(){
        
        //0、获取沙盒json路径
        let docDir = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        //拼接路径
        let jsonPath = (docDir as NSString).appendingPathComponent("main.json")
        
        //加载data
        var data = NSData(contentsOfFile: jsonPath)
        
        //判断data是否有内容，如果没有，说明本地沙盒没有文件
        if data == nil{
            //从bundle加载data
            let path = Bundle.main.path(forResource: "main.json", ofType: nil)
            data = NSData(contentsOfFile: path!)
        }
        //data一定会有内容， ----反序列化
        
        //从bundle加载配置的json
        //1、路径   2、加载NSData   3、反序列化
        guard /*let path = Bundle.main.path(forResource: "main.json", ofType: nil),
              let data = NSData(contentsOfFile:path),*/
              let array = try? JSONSerialization.jsonObject(with: data! as Data, options: []) as? [[String:Any]]    //反序列化
            else{
            return
        }
       
        
        
        //现在很多应用程序中，界面的创建都依赖网络的 json
        //很多app有一个默认的 json，程序启动加载此 json，然后发起一个网络请求，服务器返回一个json配置新的界面，新的json保存在沙盒中
        //1、检查沙盒中是否有json，若没有，则加载默认的 json，如果有，就使用新的json设置界面
        
        //*******以上是动态改变应用程序界面的逻辑
        
        //遍历数组，循环创建控制器数组
        var arrayM = [UIViewController]()
        for dict in array! {
            arrayM.append(controller(dict: dict))
        }
        //设置tabbar的子控制器
        viewControllers = arrayM
        
        //此处的结构是tabbar每一个块都是一个navigationController
    }
    
    //使用字典创建一个子控制器
    //参数：信息字典[clsName,title,imageName]   返回：子控制器
    private func controller(dict:[String:Any])->UIViewController{
        
        //1、取得字典内容
        guard let clsName = dict["clsName"] as? String,
              let title = dict["title"] as? String,
              let imageName = dict["imageName"] as? String,
              let cls = NSClassFromString(Bundle.main.namespace+"."+clsName) as? DJBaseViewController.Type,
              let visitorDict = dict["visitorInfo"] as? [String:String]        else {
            return UIViewController()
        }
        //cls是一个UIViewController.Type类型的变量
        //NSClassFromString() as ...  反射机制的使用，括号中的参数格式是命名空间+类名
        
        //2、创建视图控制器
        let vc = cls.init()
        vc.title = title
        
        //设置控制器的访客信息字典
        vc.visitorInfo = visitorDict
        
        //3、设置图片
        vc.tabBarItem.image = UIImage(named:imageName)
        vc.tabBarItem.selectedImage = UIImage(named:"tabbar_"+imageName+"selected")?.withRenderingMode(.alwaysOriginal)
        
        //4、设置tabbar标题字体
        //设置字体大小要设置在normal状态
        vc.tabBarItem.setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.orange], for: .highlighted)
        vc.tabBarItem.setTitleTextAttributes([NSFontAttributeName:UIFont.systemFont(ofSize: 12)], for: .normal)
        
        //实例化导航控制器的时候，会调用push方法将rootVC压栈
        let nav = DJNavigationController(rootViewController:vc)
        //创建以vc为根控制器的NavigationController
        return nav
        
        
    }
}

/*
 关于访问控制
 private和fileprivate
 
 private定义的变量或函数只能在包含它的大括号内被访问，比如extension中定义的private函数只能在extension中调用（在同一文件的本类中也无法调用）
 
 fileprivate定义的变量或函数允许在文件中被访问，保证方法私有，仅在当前对象被访问
 @objc fileprivate  允许这个函数在运行时通过OC的消息机制被调用
 
 */

